Procedurile de actualizare si interogare mai jos...

Code:

void update(int nod, int left, int right, int intbeg, int intend)

{
    
     int mid = (left + right) / 2;

    
     T[nod] += val;
 
   
     if ( left == right )
          return;

    
     if ( intbeg <= mid )
       
          update(2 * nod, left, mid, intbeg, intend);
           
     else
	  update(2*nod +1,mid+1, right, intbeg, intend);

}

void query(int nod,int left,int right,int beg,int end)
{
     int mid,t = 0;

     if ( begin<=left && right<=b )
          return T[n];

     mid= ( left + right ) / 2;
     if ( beg <= mid )
          t+=query(2*nod,left,mid,beg,end);
     if ( end > mid )
          t+=query(2*nod+1,mid+1,right,beg,end);
     return t;
}

/// 2

void Update(int Nod,int St,int Dr)
{
	if ( St==Dr )
	{
		A[Nod]=Val;
		return;
	}
	
	int Mid= (St+Dr) /2;
	if ( Pos<=Mid )
		Update(2*Nod,St,Mid);
	else
		Update(2*Nod+1,Mid+1,Dr);
	
	A[Nod]=max(A[2*Nod],A[2*Nod+1]);
}

void Query(int Nod,int St,int Dr)
{
	if ( Begin<=St && Dr<=End )
	{
		Max=max(Max,A[Nod]);
		return;
	}
	
	int Mid= (St+Dr) /2; 
	if ( Begin <=Mid ) 
		Query(2*Nod,St,Mid);
	if ( Mid< End )
		Query(2*Nod+1,Mid+1,Dr);
}





Observatii generale:
- implementarea si parcurgerea arborelui se refera strict la cele 2 intervale interogate 
- fiecare punct din arbore retine 3 valori ( left , right , T ) si parcugerea se refera mereu la left si right
- strctura algoritmului se aseamana extrem de mult cea a cautarii binare , deci arborele are o implementare asemanatoare cu cel de cautare binara  
